package com.camartsApp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.camartsApp.common.PhotoUserVO;
import com.camartsApp.entity.Photo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * Photo持久层
 */
@Mapper
public interface PhotoMapper extends BaseMapper<Photo> {

    List<Photo> findLatestPhotos();
    // 新增：异步查询方法（可选）
    default CompletableFuture<List<Photo>> findLatestPhotosAsync() {
        return CompletableFuture.supplyAsync(this::findLatestPhotos);
    }

    /**
     * 根据ID查询照片详细信息
     * @param id 照片ID
     * @return 照片信息
     */
    Photo findPhotoById(String id);

    /**
     * 根据照片ID查询关联的用户信息
     * @param photoId 照片ID
     * @return 用户信息
     */
    PhotoUserVO findUserByPhotoId(String photoId);
    /**
     * 获取点赞数最高的照片列表
     * @return 照片列表
     */
    List<Photo> findGreatestPhotos();


    /**
     * 根据用户ID查询照片足迹 (ID, 经纬度)
     * @param userId 用户ID
     * @return 照片足迹列表
     */
    List<Photo> findFootprintsByUserId(@Param("userId") String userId);

    /**
     * 根据地理矩形范围查询照片
     * @param userId 用户id
     * @param minLat 最小纬度
     * @param minLng 最小经度
     * @param maxLat 最大纬度
     * @param maxLng 最大经度
     * @return 照片列表
     */
    List<Photo> findPhotosByLocationRange(@Param("userId") String userId,
                                          @Param("minLat") Double minLat,
                                          @Param("minLng") Double minLng,
                                          @Param("maxLat") Double maxLat,
                                          @Param("maxLng") Double maxLng);

    Integer isLiked(@Param("userId") Long userId, @Param("photoId") Long photoId);

    /**
     * 更新photo表中的点赞数
     * @param photoId 图片id
     * @param delta 增量（可以为负）
     * @return 状态
     */
    Integer updateLikedCount(@Param("id") Long photoId, @Param("delta") int delta);

    /**
     * 根据用户ID列表批量查询用户信息
     * @param userIds 用户ID列表
     * @return 用户信息列表
     */
    List<PhotoUserVO> findUsersByUserIds(@Param("userIds") List<String> userIds);

    /**
     * 更新照片的状态 (新增)
     * @param id 图片id
     * @param status 状态
     * @return 影响行数
     */
    Integer updatePhotoStatus(@Param("id") Long id, @Param("status") int status);

}